#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <unistd.h>
#include <string.h>

union semun{int val;};
int main()
{
	//创建共享内存
	int shmid=shmget(124,sizeof(int),IPC_CREAT|0644);
	if(shmid==-1) perror("semget"),exit(1);
	//创建信号量
	int semid=semget(124,1,IPC_CREAT|0644);
	if(semid==-1) perror("semget"),exit(1);
	//初始化信号量
	union semun su;
	su.val=0;
	semctl(semid,0,SETVAL,su);
	//将共享内存挂载到自己的虚拟地址空间
	int *p=(int *)shmat(shmid,NULL,0);
	//往共享内存中写入数据
	int num=10;
	struct sembuf sb[1]={{0,1,0}};
	while(1)
	{
		sleep(1);
		*p=num++;
		semop(semid,sb,1);
	}
	shmdt(p);
}
